<?php
/**
 * Класс для построения таблиц на основе JQuery phormDatagrid
 * 
 * @category Phorm
 * @package JQuery
 * @name /Phorm/JQuery/DataGrid.php
 * @copyright phorm.ru
 * @since 15.01.2011
 * @author vladimir@kachalov.net
 */

class Phorm_JQuery_DataGrid {
	
	/**
	 * Готовим данные для подгрузки в таблицу Datagrid
	 *
	 * @param array $data
	 * @param Zend_Paginator $paginator
	 * @param mixed $params
	 */
	
	public static function data(array $data, $paginator, $params=array()) {
		
		if($params instanceof Zend_Config) $params = $params->toArray();
		
		$front = Zend_Controller_Front::getInstance();
		$boot = $front->getParam('bootstrap');
		$view = $boot->getResource('View');
		$translate = $boot->getResource('Translate');
		
		$rows = array();

		foreach ($data as $key=>$row) {
			
			foreach ($row as $field=>$value) {
				
				// Перевод
				
				$value = $translate->_($value);
				
				// Простые значения
				
				$rows[$key][$field] = $value;
				
				// Пустые значения
				
				if($value=='' || is_null($value)) $rows[$key][$field] = '&mdash;';
				
				// Заменяем url
				
				if(isset($params['headings'][$field]['url'])) {
					
					$url = self::replaceField($params['headings'][$field]['url'],$data[$key]);
					$rows[$key][$field] = '<a class="ui-phorm-grid-label" href="'.$view->getSiteUrl().urldecode($url).'">'.$value.'</a>';
					
				}
				
				// Картинка
				
				if(isset($params['headings'][$field]['image'])) {
					
					$url = self::replaceField($params['headings'][$field]['image'],$data[$key]);
					//$data[$key][$field] = '<img src="'.$front->getBaseUrl().$url.'" align="left" hspace="4" /> ' . $value;
					$rows[$key][$field] = '<img src="'.$front->getBaseUrl().$url.'" align="left" hspace="4" title="' . $value . '" /> ';
					
				}
				
				// Чекбоксы
				
				if(isset($params['headings'][$field]['checkbox'])) {
					
					$rows[$key][$field] = '<input type="checkbox" name="' . $field . '[]" class="' . $field . '" value="' . $row[$params['headings'][$field]['checkbox']] . '" />';
					
				}
				
				// Заменяем действия
				
				if(isset($params['headings'][$field]['actions'])) {
					
					$rows[$key][$field] = '';
					
					foreach ($params['headings'][$field]['actions'] as $action=>$opts) {
						
						if(!empty($opts)) {	
							$url   = isset($opts['url'])   ? self::replaceField($view->getSiteUrl().$opts['url'],$data[$key]) : '#';		   
							$title = isset($opts['title']) ? $translate->_($opts['title']) : '';		   
							$icon  = isset($opts['icon'])  ? '<span class="ui-icon ui-icon-'.$opts['icon'].'"></span>' : '';		   	   
							$text  = isset($opts['text'])  ? '<span class="ui-button-text">'.$opts['text'].'</span>' : '';		   	   
							$iconclass  = isset($opts['text'])  ? 'ui-button-text-icons' : '';		   	   
							$class  = isset($opts['class'])  ? $opts['class'] . ' ' : '';		   	   
							$rows[$key][$field] .= '&nbsp;<a href="'.$url.'" class="'.$class.$action.' ui-corner-all ui-button '.$iconclass.' ui-state-default" title="'. $translate->_($title) .'">'
												.$icon . $translate->_($text) .'</a>';
						}
						
					}
					
				}
				
				// Замена подстрок
				
				if(isset($params['headings'][$field]['replace'])) {
					$search = $params['headings'][$field]['replace']['search'];
					$replace = $params['headings'][$field]['replace']['replace'];
					if(is_array($replace)) {
						foreach ($replace as $k=>$v) $replace[$k] = $translate->_($v);
					} else {
						$replace = $translate->_($replace);
					}
					$rows[$key][$field] = str_replace($search, $replace, $data[$key][$field]);
				}
				
				// Форматирование даты
				
				if(isset($params['headings'][$field]['dateformat'])) {
					$rows[$key][$field] = $data[$key][$field]>0 ? date($params['headings'][$field]['dateformat'],$data[$key][$field]) : '&mdash;';
				}
				
				// Фильтры (простые функции с одним параметром в виде текущего значения)
				
				if(isset($params['headings'][$field]['filters']) && is_array($params['headings'][$field]['filters'])) {
					foreach ($params['headings'][$field]['filters'] as $filter) {
						if(function_exists($filter)) {
							$rows[$key][$field] = call_user_func($filter,$data[$key][$field]);
						}
					}
				}
				
			}
			
		}
		
		// @todo Здесь нам надо отловить поля, которые есть в headings, но нет в списке данных и убрать actions в запросах
		
		//
		
		$headings = array();
		$position = 0;
		
		foreach ($params['headings'] as $id=>$val) {
			
			if(isset($val['label'])) {
				
				/**
				 * Пропускаем невидимые столбцы
				 */
				if(isset($val['visible']) && (bool)$val['visible']===false) {
					continue;
				}
				
				/**
				 * Устанавливаем заголовок столбца
				 */
				
				$val['label'] = $translate->_($val['label']);
				$val['id'] = $id;
				
				/**
				 * Чекбоксы
				 */
				
				if(isset($val['checkbox'])) {
					$val['label'] = '<input type="checkbox" name="' . $id . '_all" class="' . $id . '_all" title="' . $translate->_($val['label']) . '" />';
				}
				
				/**
				 * Порядок сортировки
				 */
				
				if(isset($val['position'])) {
					$position = $val['position'];
					foreach ($headings as $y=>$z) {
						if($y>=$position) {
							unset($headings[$y]);
							$headings[++$y] = $z;
						}
					}
				} else {
					$position++;
				}
				
				$headings[$position] = $val;
				
			}
			
		}
		
		ksort($headings);
		$headings = array_values($headings);
		
		/**
		 * Накидываем справочники на поисковые формы
		 */
		
		$search = array();
		
		if(isset($params['search']) && is_array($params['search'])) {
			
			foreach ($params['search'] as $id=>$val) {
				
				// Переводчик
				
				if(isset($val['label']) && trim($val['label']) != '') {
					$val['label'] = $translate->_($val['label']);
				}
				
				// Список модулей
						
				if($val['type'] == 'SelectModule') {
							
					$Resource = new Phorm_Resource();
					$val['optiondata'] = $Resource->getModulesListAsPairs();
							
				// Список разделов
							
				} elseif($val['type'] == 'SelectCategory') {
							
					$Categories = new Phorm_Categories();
					if(isset($params['moduleid'])) {
						$val['optiondata'] = $Categories->getCategoriesPathsByModule($params['moduleid']);
					} else {
						$val['optiondata'] = $Categories->getList();
					}
							
				}
				
				// Перевод справочников
				
				if(isset($val['optiondata']) && is_array($val['optiondata'])) {
					foreach ($val['optiondata'] as $k=>$v) {
						if(is_string($v)) {
							$val['optiondata'][$k] = $translate->_($v);
						}
					}
				}
				
				$val['id'] = $id;
				$search[] = $val;
				
			}
		
		}
		
		return array(
				"pager" => array("page" => $paginator->current,
								 "pages" => $paginator->pageCount,
								 "found" => $paginator->totalItemCount,
								 "displayingStart" => $paginator->firstItemNumber,
								 "displayingEnd" => $paginator->lastItemNumber,
								 "perPage" => $paginator->itemCountPerPage),
				"headings" => $headings,
				"search" => empty($search) ? null : $search,
				"rows" => $rows
			);
		
	}
	
	
	/**
	 * Аллиас метода self::data, возврающий json-строку
	 *
	 * @param array $data
	 * @param Zend_Paginator $paginator
	 * @param array $params
	 */
	
	public static function json($data, $paginator, array $params=array()) {
		
		return Zend_Json::encode(self::data($data, $paginator, $params));
		
	}
	
	/**
	 * Заменяет шаблоны в строках данных вида %fieldname% на значение fieldname
	 *
	 * @param string $string Строка в которой производится поиск
	 * @param array $row Строка данных которая сейчас обрабатывается
	 * @return string
	 */
	
	private static function replaceField($string,$row) {
		
		if(preg_match_all("#%([^%]+)%#",$string,$strings)) {
			foreach ($strings[0] as $k=>$v) {
				$string = str_replace($strings[0][$k],urlencode($row[$strings[1][$k]]),$string);
			}
		}
		
		return $string;
		
	}
	
}